package com.groupten.Controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.groupten.Entity.*;
import com.groupten.Service.*;
import com.groupten.ServiceImpl.StudentPaperServiceImpl;
import com.groupten.ServiceImpl.WqHouseServiceImpl;
import com.groupten.Vo.ExamVo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.*;


@Slf4j
@RestController
@RequestMapping("group10/paper")
public class PaperController {
    /**
     * 注入Service 2
     *    Controller 2
     */
    @Autowired
    private PaperService paperService;
    @Autowired
    private StudentService studentService;
    @Autowired
    private StudentPaperService studentPaperService;
    @Autowired
    private WqHouseService wqHouseService;

    /**
     *
     * @param session 试卷编号（场次）
     * @return 删除的词条数，
     */
    @PostMapping("deleteBySession")
    public Integer deleteBySession(Integer session) {
        return paperService.deleteBySession(session);
    }

    /**
     *按场次选取试卷
     * @param session 试卷编号（场次）
     * @param page 展示页数，默认为1
     * @param limit 展示词条数，默认为20
     * @return IPage格式的试卷表
     */
    @GetMapping("selectBySession")
    public IPage<PaperEntity> selectBySession(Integer session, Integer page, Integer limit) {
        return paperService.selectBySession(session, page, limit);
    }

    /**
     * 按学科选取试卷
     * @param subject 试卷科目
     * @param page 展示页数，默认为1
     * @param limit 展示词条数，默认为20
     * @return IPage格式的试卷表
     */
    @GetMapping("selectBySubject")
    public IPage<PaperEntity> selectBySubject(Integer subject, Integer page,Integer limit) {
        return paperService.selectBySubject(subject, page, limit);
    }


    /*
        studentID 学生学号
        studentClass 学生班级
        answerSheet 答题卡
     */
    private static String studentID=new String();
    private static String studentClass=new String();
    private static ExamVo answerSheet;
    /**
     * 考试获取试卷，返回一个整数，表示访问状态
     * @param page 分页
     * @param limit 条数
     * @param studentId 学号
     * @param session 考试场次
     * @return 一个整数，若该场考试不存在返回-1，否则返回1;获取到的试卷将题目输出到屏幕，后续可扩展到其他输出途径
     *         在获取试卷的同时，根据试卷的场次生成一张空答题卡
     */
    @GetMapping("testGet")
    Integer getPaper(Integer page, Integer limit,Integer studentId,Integer session) {
        StudentEntity student = studentService.selectById(Long.valueOf(studentId));
        studentID=student.getStudentNumber();
        studentClass=student.getStudentClass();
        IPage<PaperEntity> paperEntity=paperService.selectBySession(session,page,limit);
        if(paperEntity==null){
            return -1;
        }
        answerSheet=paperService.answerSheetGenerate(session,paperEntity);
        paperService.questionDisplay(paperEntity);
  //      System.out.println(answerSheet);
        return 1;
    }

    /**
     * 无参，模拟答题过程
     * 键盘输入各题答案，允许留空
     * @return 整数1，表示正常返回
     * 在真实使用过程中，judge请求将由setAnswer发出，return 1;修改为return judge(answerSheet);，直接返回错题数量
     */
    @PostMapping("answer")
    Integer setAnswer() {
        Map<Integer, String> answers=paperService.answerSet(answerSheet);
        answerSheet.setAnswer(answers);
        System.out.println(answerSheet);//展示答题后的answerSheet
        return judge(answerSheet);
    }
    /**
     * 根据答案判分，并将学生信息与得分存入student_paper表，同时录入错题
     * 通过向StudentPaperController和WqHouseController发送请求完成数据录入
     * 答题卡可以通过答题过程生成，也可以通过postman输入，二者等效
     * @param examVo 答题卡，包含考试场次Session和答题卡答案AnswerSheet
     * @return 一个整数，答题卡异常时返回-1，否则返回错题数量
     */
    @PostMapping("judge")
    public Integer judge(@RequestBody ExamVo examVo) {
        if(examVo.getPaperSession()==null||examVo.getAnswer()==null){
            return -1;//返回错误标记
        }
        Map<Double, List<QuestionEntity>> answerResult = paperService.scoring(examVo.getAnswer()); //mp为返回的Map，key为得分，List为错题列表
        studentPaperService.studentPaperIns(examVo.getPaperSession(),answerResult,studentClass,studentID);
        return wqHouseService.WQHouseIns(answerResult,studentID);//返回错题数量
    }

}
